package cn.nr19.jian.`object`

import cn.nr19.jian.J2Utils
import cn.nr19.jian.exception.ParserException
import cn.nr19.jian.token.J2Node
import cn.nr19.jian.token.NULL
import java.lang.reflect.Modifier

/**
 * 对象 和 JianLeiApi　都是基础类
 */
interface JianObject {

    fun pFun(data : JianLeiApi,name: String, pars: List<Any>) : Any?{
        val anys = ArrayList<Class<*>>()
        val datas = ArrayList<Any>()

        // 先尝试设置参数
        if (pars.size == 1){
            setPar(name,pars[0])?.let {
                return it
            }
        }

        pars.forEach {
            val v = it
            when{
                v is Boolean -> anys.add(Boolean::class.java)
                v is String -> anys.add(String::class.java)
                v is Int -> anys.add(Int::class.java)
                v is Long -> anys.add(Int::class.java)
                v is Double -> anys.add(Double::class.java)
                v is Float -> anys.add(Float::class.java)
                v is JianLeiApi ->anys.add(JianLeiApi::class.java)
                else -> {
                    anys.add(v::class.java)
                }
            }
            datas.add(v)
        }
        try {
            // getDeclaredMethod // getMethod 本类
            return if (anys.isEmpty()) this.javaClass.getMethod(name).invoke(this) ?: ""
            else this.javaClass.getMethod(name,*anys.toTypedArray())
                .invoke(this,*datas.toTypedArray()) ?: ""
        }
        // 没有该功能
        catch (e : NoSuchMethodException){
            if (name.equals("刷新布局")){
                J2Utils.log("ppp",name,anys.size)
                e.printStackTrace()
                J2Utils.log("e exte",e.message)
            }
            if ((name == "监听" || name == "添加事件听众") && pars.size == 2 && pars[0] is String && pars[1] is J2Node){
                addListener(pars[0].toString(),pars[1] as J2Node,data)
                return true
            }

            try {
                // 尝试添加 简对象
                anys.add(0,JianLeiApi::class.java)
                datas.add(0,data)
                return if (anys.isEmpty()) this.javaClass.getMethod(name).invoke(this) ?: ""
                else this.javaClass.getMethod(name,*anys.toTypedArray())
                    .invoke(this,*datas.toTypedArray()) ?: ""
            }
            catch (e:ParserException){
                throw e
            }
            catch (e : NoSuchMethodException){
                return null
            }
            catch (e : Exception){
                throw ParserException("执行功能失败 ${name}(${pars})",0)
            }
        }
        catch (e : Exception){

            //e.printStackTrace()
            throw ParserException("执行功能失败 ${name}(${pars})",0)
        }

    }






    // 添加听众
    fun addListener(name : String, j2 : J2Node, data : JianLeiApi){

    }

    // 取参数
    fun getPar(name: String,data: JianLeiApi?=null) : Any?{
        try {
            return this.javaClass.getMethod(name).invoke(this)
            /*if (data == null){
                return this.javaClass.getMethod(name).invoke(this)
            }else{
                return pFun(data,name, ArrayList())
            }*/
        }catch (e : Exception){
            return null
        }
    }

    // 设置参数
    fun setPar(name : String,value : Any) : Any?{

        val anys = ArrayList<Class<*>>()
        val datas = ArrayList<Any>()
        val v = value
        when{
            v is Boolean -> anys.add(Boolean::class.java)
            v is String -> anys.add(String::class.java)
            v is Int -> anys.add(Int::class.java)
            v is Long -> anys.add(Int::class.java)
            v is Double -> anys.add(Double::class.java)
            v is Float -> anys.add(Float::class.java)
            v is JianLeiApi ->anys.add(JianLeiApi::class.java)

            else -> {
                anys.add(v::class.java)
            }
        }
        datas.add(v)

        try {
            return this.javaClass.getMethod(name,*anys.toTypedArray())
                .invoke(this,*datas.toTypedArray())?:""
        }
        catch (e : Exception){

           return null
        }


    }



    // **********************************************************
    // ****************** 对象 *******************************
    fun onKill(){}
    fun onPause(){}
    fun onResume(){}
    fun onStart(){}




}